package com.atguigu.gulimall.authserver.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.atguigu.common.constant.AuthServerConstant;
import com.atguigu.common.utils.HttpUtils;
import com.atguigu.common.utils.R;
import com.atguigu.gulimall.authserver.feign.MemberFeignService;
import com.atguigu.common.vo.MemberResponseVo;
import com.atguigu.gulimall.authserver.vo.ResponseEntity;
import com.atguigu.gulimall.authserver.vo.SocialUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;


/**
 * 处理社交登录请求
 */
@Controller
@Slf4j

public class OAuth2Controller {

    @Autowired
    private MemberFeignService memberFeignService;

    /**
     * 用户登录成功后的回调地址@GetMapping("/oauth2.0/weibo/success")
     * 完整为 http://auth.gulimall.com/oauth2.0/weibo/success?code=xxxxxxxxxxxxxxxxx
     * @param code 用户登录成功返回的数据
     * @param session 保存信息，重定向给前端展示
     */
    @GetMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code") String code, HttpSession session) throws Exception {
        // 1 根据code 获取access token
        // 构建请求参数
        Map<String, String> map = new HashMap<>();
        map.put("grant_type", "authorization_code");
        map.put("code", code);
        map.put("client_id", "cdbb3b834600874fae0c0d8abe36e012b9c5a114f59917b55427fcd6db9ced86");
        map.put("redirect_uri", "http://auth.gulimall.com/oauth2.0/weibo/success");
        map.put("client_secret", "977293dcea8164fb868caac297fefec72a86d8654f4153db37bf25b67ebbb772");
        // 发送post请求
        HttpResponse response = HttpUtils.doPost("https://gitee.com", "/oauth/token", "post", new HashMap<>(), new HashMap<>(), map);

        // 处理
        if (response.getStatusLine().getStatusCode() == 200) {
            // 获取access token
            String json = EntityUtils.toString(response.getEntity());
            ResponseEntity responseEntity = JSON.parseObject(json, ResponseEntity.class);
            // 获取Access_token
            String access_token = responseEntity.getAccess_token();

            // 根据access token 获取用户信息
            // 构建请求参数
            Map<String, String> userInfoMap = new HashMap<>();
            userInfoMap.put("access_token", access_token);
            // 发送请求
            HttpResponse socialUserInfo = HttpUtils.doGet("https://gitee.com", "/api/v5/user", "get", new HashMap<>(), userInfoMap);
            String socialUserInfoStr = EntityUtils.toString(socialUserInfo.getEntity());
            SocialUser socialUser = JSON.parseObject(socialUserInfoStr, SocialUser.class);
            socialUser.setResponseEntity(responseEntity);

            // 调用远程服务，使用第三方登录
            R oauthLogin = memberFeignService.oauthLogin(socialUser);
            if (oauthLogin.getCode() == 0) {
                // 成功
                MemberResponseVo data = oauthLogin.getData("data", new TypeReference<MemberResponseVo>() {
                });
                log.info("登录成功，信息：" + data.toString());

                /*
                     第一次使用session 命令浏览器保存id JSESSIONID 这个 cookie
                     之后浏览器访问网站都会携带这个cookie
                     子域名 a.b.com 的cookie 不能在父域名使用 b.com
                     在设置cookie的时候可以，指定domain 为父域名，这样就可以共享了
                 */
                // TODO: 1 默认发的令牌为 SESSION=XXX，作用域为当前服务域。解决共享子域问题
                // TODO: 2 spring session 将数据保存到 redis 中默认用serialization 序列化，配置成使用 json 序列化方式
                session.setAttribute(AuthServerConstant.LOGIN_USER, data);

                /*Cookie cookie = new Cookie("JSESSIONID", "xxx");
                cookie.setDomain("b.com");
                httpServletResponse.addCookie(cookie);*/

                // 2 回到首页
                return "redirect:http://gulimall.com";
            }
        }

        // 登录失败
        return "redirect:http://auth.gulimall.com/login.html";
    }
}
